#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <vector>

#define MAX_SIGNUM 31
#define BLOCK_SIGNAL 2

using namespace std;

static vector<int> sigarr = {2};

void handle(int signo)
{
    std::cout << std::endl << "i catch a signal, its name is " << signo << std::endl;
}

static void showPending(const sigset_t& pending)
{
    for(int signo = MAX_SIGNUM; signo >= 1; --signo)
    {
        if(sigismember(&pending, signo))
        {
            std::cout << '1';
        }
        else
        {
            std::cout << '0';
        }
    }
    std::cout << '\n' ;
}

static void myhandle(int signo)
{
    cout << signo << "号信号已抵达" << endl;
}

int main()
{
    for(const auto& sig : sigarr) signal(sig, myhandle);

    sigset_t block, oblock, pending;
    //初始化
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigemptyset(&pending);
    //添加对应的阻塞信号
    for(const auto& sig : sigarr) sigaddset(&block, sig);
    //同步进内核
    sigprocmask(SIG_SETMASK, &block, &oblock);

    int cnt = 0;
    //查看打印block集合
    while(cnt++ <= 50)
    {
        //初始化
        sigemptyset(&pending);
        //获取
        sigpending(&pending);
        //打印
        showPending(pending);
        //慢一点
        sleep(1);

        if(cnt % 10 == 0 && (cnt/10) % 2 != 0)
        {
            cout << "去除对信号的屏蔽\n";
            sigprocmask(SIG_SETMASK, &oblock, &block);
        }

        if(cnt % 20 == 0)
        {
            cout << "再次添加阻塞信号" << endl;
            sigprocmask(SIG_SETMASK, &block, &oblock);
        }

        // if(cnt++ == 10)
        // {
        //     cout << "去除对信号的屏蔽\n";
        //     sigprocmask(SIG_SETMASK, &oblock, &block);
        // }
        
    }
    return 0;
}